package org.dromara.common.core.utils;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * OpenID 生成器
 *
 * @author ycjz
 * @date 2025/9/24
 */
public class OpenIdGenerator {
    // 盐值（独立存储，定期更换）
    private static final String SALT = "ycjz_ys";

    /**
     * 生成32位的用户-应用唯一标识（类似OpenID）
     * @param userId 用户唯一ID
     * @param appId 应用唯一ID
     * @return 32位字符串标识
     */
    public static String generate32BitOpenId(String userId, String appId) {
        try {
            // 1. 拼接原始数据：用户ID + 应用ID + 盐值
            String rawData = userId + "|" + appId + "|" + SALT;

            // 2. 使用MD5哈希（128位，确保结果长度可控）
            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] hashBytes = digest.digest(rawData.getBytes(StandardCharsets.UTF_8));

            // 3. 转换为十六进制字符串（32位）
            StringBuilder hexStr = new StringBuilder();
            for (byte b : hashBytes) {
                // 转16进制，确保两位数（补0）
                String hex = Integer.toHexString(0xFF & b);
                if (hex.length() == 1) {
                    hexStr.append('0');
                }
                hexStr.append(hex);
            }
            return hexStr.toString();

        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("哈希算法异常", e);
        }
    }
}
